import axios from 'axios'
import {Message} from "element-ui";
import {getTokenHead, getTokenHeaderName,getToken,removeToken,removeTokenHead,removeTokenHeaderName} from "./auth";



import router from '../router'

//创建axios实例
const axiosInstance = axios.create({
  //配置请求的基本路径
  baseURL:process.env.BASE_API,
  //配置超时时间，单位是毫秒,即请求在1000内没响应就宣告请求失败
  timeout:1000
});


//配置请求前的拦截代码
axiosInstance.interceptors.request.use(config=>{

  //配置content-type为 json
  config.headers['content-type'] = 'application/json';
  // TODO 在请求发出前添加其它配置,例如用于用户认证的token信息等
  config.headers[getTokenHeaderName()] = getTokenHead()+' '+getToken();

  return config
},error => {
  Promise.reject(error)
})


//配置响应后的拦截代码
axiosInstance.interceptors.response.use(response=>{
    // TODO 对响应正常的处理
    /**
     *  我们在后端做了统一返回格式,还记得那个ResultCode枚举类吗？ 那么我们针对这些返回状态码做一个信息提示
     *  注意: 下边我们取的response.data的结构正好对应我们后端的CommonResult的结构,即 code,message,data这三个属性
     */
    const data = response.data;
    switch (data.code) {
      case 200: // GET/PUT/PATCH响应OK,即获取，更新数据成功
      case 201: // POST 响应OK,即创建数据成功
      case 204: return data;  // DELETE 响应成功,即删除数据成功

      case 401: //TODO 用户未登录或token过期，后续在此需要做路由跳转到
        removeToken();
        removeTokenHead();
        removeTokenHead();
        router.push("/login");
        break;
      case 403:   Message.error(data.message);break;
      case 400: //错误的请求,格式不对或参数校验失败
      case 404: //资源未找到
      case 500: //服务器内部错误
      default:
        //统一打印错误信息
        console.error(data.message);
        //将错误信息继续转出去,外边用catch可捕获
        return Promise.reject(data.message);
    }

  },
  error => {
    // TODO 对响应错误的处理
    return Promise.reject(error)
  }
)

export default axiosInstance;
